#include "FrameInfo.h"

using namespace game_engine::data_format;
using namespace game_engine::utils;

///////////////////////////////////////////////////////////////////////////////
// Constructors and Destructors
///////////////////////////////////////////////////////////////////////////////

FrameInfo::FrameInfo(void)
    : coord(), duration(), flipHorizontally(false), flipVertically(false), 
    rotation(0.0), scale(1.0)
{
}

FrameInfo::FrameInfo(const Point &c, const INT32 t, const BOOL flipH, 
                     const BOOL flipV, const FLOAT32 rot, const FLOAT32 sca)
    : coord(c), duration(t), flipHorizontally(flipH), flipVertically(flipV), 
    rotation(rot), scale(sca)
{
}

FrameInfo::~FrameInfo(void)
{
}

///////////////////////////////////////////////////////////////////////////////
// Other public methods
///////////////////////////////////////////////////////////////////////////////

void FrameInfo::parse(xml_node<> *node)
{
    try
    {
        getFrameInfo(node);
    } catch (exception)
    {
        // TODO
    }
}

///////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////

void FrameInfo::getFrameInfo(xml_node<> *node)
{
    //id = atoi(node->value());
    string val = node->value();
    // TODO : check for errors here !!!
    size_t pos = val.find(",");
    coord.setX(atof((val.substr(0, pos)).c_str()));
    coord.setY(atof((val.substr(pos+1)).c_str()));

    for (xml_attribute<> *attr = node->first_attribute(); 
        attr; attr = attr->next_attribute())
    {
        if (string(attr->name()) == "time")
        {
            duration = atoi(attr->value());
        }
        else if (string(attr->name()) == "flip_hor")
        {
            flipHorizontally = getBoolean(string(attr->value()));
        }
        else if (string(attr->name()) == "flip_vert")
        {
            flipVertically = getBoolean(string(attr->value()));
        }
        else if (string(attr->name()) == "rotation")
        {
            rotation = atof(attr->value());
        }
        else if (string(attr->name()) == "scale")
        {
            scale = atof(attr->value());
        }
    }
}

BOOL FrameInfo::getBoolean(const string &val) const
{
    BOOL result = false;

    if (val == "false")
    {
        result = false;
    }
    else if (val == "true")
    {
        result = true;
    }
    else
    {
        // throw exception
    }

    return result;
}

///////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////

//const INT32 FrameInfo::getId(void) const
//{
//    return id;
//}

const Point& FrameInfo::getCoord(void) const
{
    return coord;
}

const INT32 FrameInfo::getDuration(void) const
{
    return duration;
}

const BOOL FrameInfo::getFlipHorizontally(void) const
{
    return flipHorizontally;
}

const BOOL FrameInfo::getFlipVertically(void) const
{
    return flipVertically;
}

const FLOAT32 FrameInfo::getRotation(void) const
{
    return rotation;
}

const FLOAT32 FrameInfo::getScale(void) const
{
    return scale;
}
